{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1-单变量线性回归\n",
    "\n",
    "##  案例：假设你是一家餐厅的CEO，正在考虑开一家分店，那么该选择哪座城市呢？\n",
    "###  我们拥有不同城市对应的人口数据以及利润： ex1data1.txt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np #科学计算库，处理多维数组，进行数据分析\n",
    "import pandas as pd #pandas 是基于NumPy 的一种工具，该工具是为了解决数据分析任务而创建的\n",
    "import matplotlib.pyplot as plt # Python 的 2D绘图库,matplotlib.pyplot：提供一个类似matlab的绘图框架"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html\n",
    "\n",
    "pandas.read_csv(filepath_or_buffer, sep=', ', delimiter=None, header='infer', names=None, index_col=None, usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, iterator=False, chunksize=None, compression='infer', thousands=None, decimal=b'.', lineterminator=None, quotechar='\"', quoting=0, escapechar=None, comment=None, encoding=None, dialect=None, tupleize_cols=None, error_bad_lines=True, warn_bad_lines=True, skipfooter=0, doublequote=True, delim_whitespace=False, low_memory=True, memory_map=False, float_precision=None)\n",
    "\n",
    "#### 1. filepath_or_buffer:字符串，要读取的文件存放的路径,可以为：http, ftp, s3, and file\n",
    "#### 2. sep：字符串，分隔符，默认为',' \n",
    "#### 3. header: 整数，指定第几行作为列名(忽略注解行)，如果没有指定列名，默认header=0\n",
    "#### 4. names: 列表，指定列名\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>population</th>\n",
       "      <th>profit</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6.1101</td>\n",
       "      <td>17.5920</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>5.5277</td>\n",
       "      <td>9.1302</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8.5186</td>\n",
       "      <td>13.6620</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>7.0032</td>\n",
       "      <td>11.8540</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5.8598</td>\n",
       "      <td>6.8233</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   population   profit\n",
       "0      6.1101  17.5920\n",
       "1      5.5277   9.1302\n",
       "2      8.5186  13.6620\n",
       "3      7.0032  11.8540\n",
       "4      5.8598   6.8233"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data  = pd.read_csv(\"ex1data1.txt\",names = ['population','profit'])\n",
    "data.head() # "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 97 entries, 0 to 96\n",
      "Data columns (total 2 columns):\n",
      "population    97 non-null float64\n",
      "profit        97 non-null float64\n",
      "dtypes: float64(2)\n",
      "memory usage: 1.6 KB\n"
     ]
    }
   ],
   "source": [
    "data.describe()\n",
    "data.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "##DataFrame ,类似于excel,是一个二维表"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html\n",
    "#### https://matplotlib.org/users/pyplot_tutorial.html\n",
    "#### http://pandas.pydata.org/pandas-docs/stable/visualization.html"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEKCAYAAAAfGVI8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzt3X+UXHWZ5/H30+kmGUnAQBPISDMBVyFgEn603SAGGBEHgSO4B1QYMYhLwnqCgjunzTiHIa5nXMyuZJFxNbiCEQKDAypZF1azrEAYoUMnhAQJv2SbdDSbhMQhwUBIp5/9495KV1duVd3qrls/7v28zqlTVbdu1f2munKf+/31fM3dERGR7GqpdwFERKS+FAhERDJOgUBEJOMUCEREMk6BQEQk4xQIREQyToFARCTjFAhERDJOgUBEJONak/pgM+sAfgwcBQwBt7v7rWa2ELgG2Bbu+jV3f6jUZ7W3t/u0adOSKqqISCqtXr36dXc/otx+iQUCYBD4D+6+xswmAavNbEX42mJ3/y9xP2jatGn09fUlUkgRkbQys9fi7JdYIHD3zcDm8PEuM9sAvCep44mIyOjUpI/AzKYBpwC94ab5ZrbOzO4ws8m1KIOIiERLPBCY2UTgAeB6d98JfA94L3AyQY3h20XeN9fM+sysb9u2bVG7iIhIFSTZR4CZtREEgWXu/lMAd9+S9/oPgF9EvdfdbwduB+js7DwgV/bevXvZtGkTb7/9dhJFz7wJEyZw9NFH09bWVu+iiEjCkhw1ZMAPgQ3ufkve9qlh/wHAJ4HnRvP5mzZtYtKkSUybNo3gUFIt7s727dvZtGkTxx57bL2LIyIJS7Jp6EzgSuAjZrY2vF0ALDKz9Wa2DvhL4IbRfPjbb7/N4YcfriCQADPj8MMPV21LpE4GBuC666CrK7gfGEj2eEmOGnoCiDpLl5wzUAkFgeTouxWpj4EBmDUL3nwT9u6FtWth2TJ49lno6EjmmJpZLCLSQBYtGg4CENy/+WawPSkKBA2sv7+fD3zgA2X3ueeee/Y/7+vr40tf+lLSRRORhPT2DgeBnL17YdWq5I6pQNDkCgNBZ2cn3/nOd+pYIhEZi+5uKBys19YW9BckJTOBIInOl/7+fk444QTmzJnDzJkzufTSS9m9ezePPPIIp5xyCjNmzODqq69mz549QJAq46tf/SpdXV10dXXxyiuvAHDVVVdx//337//ciRMnRh5r9uzZnHrqqZx66qn85je/AWDBggWsXLmSk08+mcWLF/Poo49y0UUXAbBjxw4uueQSZs6cyemnn866desAWLhwIVdffTXnnHMOxx13nAKHSAPp6YGJE4eDQVtb8LynJ7ljZiIQ5DpfliyBp58O7mfNqk4wePHFF5k7dy7r1q3jkEMO4ZZbbuGqq67ivvvuY/369QwODvK9731v//6HHHIIq1atYv78+Vx//fWxjzNlyhRWrFjBmjVruO+++/Y3/9x8883Mnj2btWvXcsMNIwdg3XTTTZxyyimsW7eOb37zm3zuc5/b/9oLL7zAL3/5S1atWsXXv/519hbWRUWkLjo6go7hefOCC9d585LtKIaMBIIkO186Ojo488wzAfjsZz/LI488wrHHHsv73/9+AObMmcPjjz++f//LL798//2TTz4Z+zh79+7lmmuuYcaMGVx22WU8//zzZd/zxBNPcOWVVwLwkY98hO3bt/PGG28AcOGFFzJ+/Hja29uZMmUKW7ZsKfVRIlJDHR1w221Bf8FttyUbBCDhmcWNIsnOl0qHWebvn3vc2trK0NAQEEzmeueddw543+LFiznyyCN59tlnGRoaYsKECWWP5X7AhOz9xxw/fvz+bePGjWNwcLCif4eIpEcmagRJdr5s3Lhx/5X9vffey0c/+lH6+/v3t//fddddnH322fv3v++++/bfn3HGGUDQd7B69WoAHnzwwchmmjfeeIOpU6fS0tLCXXfdxb59+wCYNGkSu3btiizbWWedxbJlywB49NFHaW9v55BDDhn7P1pEUiUTgSDJzpfp06ezdOlSZs6cyY4dO7jhhhu48847ueyyy5gxYwYtLS1ce+21+/ffs2cP3d3d3HrrrSxevBiAa665hscee4yuri56e3s5+OCDDzjOF7/4RZYuXcrpp5/OSy+9tH+fmTNn0trayqxZs/Z/Xs7ChQvp6+tj5syZLFiwgKVLl479HywiqWNRzQeNprOz0wsXptmwYQPTp0+P/RkDA0GfwKpVQU2gp2fs7W79/f1cdNFFPPdcvHRJuQV22tvbx3bgGqn0Oxaphdz/5d7eoLZfjf/LaWVmq929s9x+megjgOHOFxFpXvVIv5AFmWgaSsq0adNi1wYgqEE0S21ApBHVI/1CFjR1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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "data.plot.scatter('population','profit',c='b',label='population',s=30)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### DataFrame.insert(loc, column, value, allow_duplicates=False)\n",
    "#### loc: 插入的列索引\n",
    "#### column: 插入列的标签\n",
    "#### value ：插入列的值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ones</th>\n",
       "      <th>population</th>\n",
       "      <th>profit</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>6.1101</td>\n",
       "      <td>17.5920</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>5.5277</td>\n",
       "      <td>9.1302</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>8.5186</td>\n",
       "      <td>13.6620</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>7.0032</td>\n",
       "      <td>11.8540</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>5.8598</td>\n",
       "      <td>6.8233</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   ones  population   profit\n",
       "0     1      6.1101  17.5920\n",
       "1     1      5.5277   9.1302\n",
       "2     1      8.5186  13.6620\n",
       "3     1      7.0032  11.8540\n",
       "4     1      5.8598   6.8233"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 给数据增加一列1\n",
    "data.insert(0,'ones',1)\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 构造数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 特征向量\n",
    "X = data.iloc[:,0:-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ones</th>\n",
       "      <th>population</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>92</th>\n",
       "      <td>1</td>\n",
       "      <td>5.8707</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>93</th>\n",
       "      <td>1</td>\n",
       "      <td>5.3054</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>94</th>\n",
       "      <td>1</td>\n",
       "      <td>8.2934</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>95</th>\n",
       "      <td>1</td>\n",
       "      <td>13.3940</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>96</th>\n",
       "      <td>1</td>\n",
       "      <td>5.4369</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    ones  population\n",
       "92     1      5.8707\n",
       "93     1      5.3054\n",
       "94     1      8.2934\n",
       "95     1     13.3940\n",
       "96     1      5.4369"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.tail()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "92    7.20290\n",
       "93    1.98690\n",
       "94    0.14454\n",
       "95    9.05510\n",
       "96    0.61705\n",
       "Name: profit, dtype: float64"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y = data.iloc[:,-1]\n",
    "y.tail()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>profit</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>92</th>\n",
       "      <td>7.20290</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>93</th>\n",
       "      <td>1.98690</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>94</th>\n",
       "      <td>0.14454</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>95</th>\n",
       "      <td>9.05510</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>96</th>\n",
       "      <td>0.61705</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     profit\n",
       "92  7.20290\n",
       "93  1.98690\n",
       "94  0.14454\n",
       "95  9.05510\n",
       "96  0.61705"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cols = data.shape[1]\n",
    "X = data.iloc[:,0:cols-1]#X是所有行，去掉最后一列\n",
    "y = data.iloc[:,cols-1:cols]#X是所有行，最后一列\n",
    "y.tail()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###  dataframe -> ndarray\n",
    "#### 1. df.values\n",
    "#### 2. df.as_matrix()\n",
    "#### 3. np.array(df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(97, 2)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(97, 1)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = X.values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(97, 2)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "y = y.values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(97, 1)"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-2.6807"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y.min()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 定义损失函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "def costFunction(X,y,theta):\n",
    "    inner =np.power((X @ theta - y),2)\n",
    "    return np.sum(inner) / (2 * len(X))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 初始化theta"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "theta = np.zeros((2,1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2, 1)"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "theta.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "cost_init = costFunction(X,y,theta)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "32.072733877455676\n"
     ]
    }
   ],
   "source": [
    "print(cost_init)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 梯度下降法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "def gradientDescent(X,y,theta,iters,alpha):\n",
    "    m = len(X)\n",
    "    costs = []\n",
    "    \n",
    "    for i in range(iters):\n",
    "        theta  = theta -(alpha/m)  * X.T @ (X@theta - y)\n",
    "        cost = costFunction(X,y,theta)\n",
    "        costs.append(cost)\n",
    "        if i % 100 == 0:\n",
    "            print(cost)\n",
    "    return costs, theta"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "16.769642371667462\n",
      "5.170668092303259\n",
      "4.813840215803055\n",
      "4.640559602034057\n",
      "4.556412109403549\n",
      "4.5155489085988645\n",
      "4.495705166048674\n",
      "4.486068766778817\n",
      "4.481389196347322\n",
      "4.479116731414093\n",
      "4.478013190619409\n",
      "4.477477295755764\n",
      "4.477217057705422\n",
      "4.477090682463859\n",
      "4.477029312876824\n",
      "4.476999510945953\n",
      "4.476985038710983\n",
      "4.476978010791016\n",
      "4.476974597934661\n",
      "4.476972940603823\n"
     ]
    }
   ],
   "source": [
    "iters = 2000\n",
    "alpha = 0.02\n",
    "costs,theta = gradientDescent(X,y,theta,iters,alpha)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-3.8928815 ],\n",
       "       [ 1.19274237]])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "theta"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 代价函数可视化\n",
    "### https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html#matplotlib.pyplot.plot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x11935fd68>]"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(costs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#返回一个 Figure实例fig 和一个 AxesSubplot实例ax 。这个很好理解，fig代表整个图像，ax代表坐标轴和画的图\n",
    "fig, ax = plt.subplots()\n",
    "ax.plot(np.arange(iters),costs,'b') #列表\n",
    "ax.set(xlabel='iters', \n",
    "       ylabel='costs',\n",
    "       title='cost vs iters')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 拟合函数可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.linspace(y.min(),y.max(),100)\n",
    "y_ = theta[0,0] + theta[1,0] * x\n",
    "fig, ax = plt.subplots()\n",
    "ax.scatter(X[:,-1],y,label='training data')\n",
    "ax.plot(x,y_,'r',label = 'predict')\n",
    "ax.legend()\n",
    "ax.set(xlabel='population', \n",
    "       ylabel='profit',)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 6 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(2,3)\n",
    "plt.subplots_adjust(top=0.92, bottom=0.08, left=0.10, right=0.95, hspace=0.25,\n",
    "                    wspace=0.35)\n",
    "box = dict(facecolor='yellow', pad=5, alpha=0.2)\n",
    "ax1 = ax[1, 2]\n",
    "ax1.plot(2000*np.random.rand(10))\n",
    "ax1.set_title('ylabels not aligned')\n",
    "ax1.set_ylabel('misaligned 1', bbox=box)\n",
    "ax1.set_ylim(0, 2000)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
